const exec = require('child_process').exec


/**
 * 
 * @param {string} cmdStr 期望执行的命令
 * @param {string} cmdPath 执行命令的目录
 * @workerProcess 子进程实例
 */

export function runExec(cmdStr, cmdPath) {
  let workerProcess
  // 执行命令行，如果命令不需要路径，或就是项目根目录，则不需要cwd参数：
  workerProcess = exec(cmdStr, cmdPath ? { cwd: cmdPath } : {})
  // 不受child_process默认的缓冲区大小的使用方法，没参数也要写上{}：workerProcess = exec(cmdStr, {})

  // 打印正常的后台可执行程序输出
  workerProcess.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
  });

  // 打印错误的后台可执行程序输出
  workerProcess.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
  });

  // 退出之后的输出
  workerProcess.on('close', function (code) {
    console.log('out code：' + code);
  })


  return workerProcess
}


// 关闭项目中的所有进程，主要是为了关闭刚刚启动的服务器进程。
/**
 * 
 * @param {子进程} serverProcess 
 */
export function stopServer(serverProcess) {
  console.log("Kill server process.....");
  const kill = require("tree-kill"); //  tree-kill是一个插件，需要安装，在项目中已经用 yarn add tree-kill 命令安装。
  if (serverProcess) {
    kill(serverProcess.pid, "SIGTERM", function (_err) {
      // 终止进程树，杀死所有进程，包括根进程。
      console.log("Killed");
      serverProcess = null;
    });
  }
}